/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2024-03-07     Hao       the first version
 */
#ifndef SIMPLEFOC_INLINE_CURRENT_SENSE_H_
#define SIMPLEFOC_INLINE_CURRENT_SENSE_H_

#include "foc_utils.h"

class InlineCurrentSense
{
public:
    /**
     InlineCurrentSense class constructor
     @param shunt_resistor 采样电阻阻值
     @param gain 电流传感器增益
     @param phA A phase adc pin
     @param phB B phase adc pin
     @param phC C phase adc pin (optional)
     */
    InlineCurrentSense(float shunt_resistor, float gain, uint8_t chA, uint8_t chB, uint8_t chC);
    ~InlineCurrentSense();

    // 初始化设备
    int init();

    // 获取三相电流（原始电流）,需要用户自己实现
    PhaseCurrent_s getPhaseCurrents();

    // 获取q电流，DC电流控制模式下使用
    float getDCCurrent(float angle_el);

    // 获取dq电流，foc控制模式下使用
    DQCurrent_s getFOCCurrents(float angle_el);

    // 获取ADC电压，需要用户自己实现
    float readADCVoltageInline(uint8_t phase);

private:
    int8_t ch_a_; // A项电流检测对应的adc通道
    int8_t ch_b_; // B项电流检测对应的adc通道
    int8_t ch_c_; // C项电流检测对应的adc通道

    float shunt_resistor_;      // 采样电阻阻值
    float volts_to_amps_ratio_; // 电压计算为电流的比率，通过采样电阻和增益计算后的值，减少程序运行过中的计算

    // 电流增益，一般三路都是一样的，如果有某一个反接的话，则其正负是反的。
    float gain_a_; // phase A gain
    float gain_b_; // phase B gain
    float gain_c_; // phase C gain

    // 电流偏移，当电流为0是，ADC读到的电流值
    float offset_ia_; // zero current A voltage value (center of the adc reading)
    float offset_ib_; // zero current B voltage value (center of the adc reading)
    float offset_ic_; // zero current C voltage value (center of the adc reading)

    void calibrateOffsets();
};

#endif /* SIMPLEFOC_INLINE_CURRENT_SENSE_H_ */
